import { sysLoginRequest, sysProfileRequest } from '@/api/user'
import { getToken, setToken } from '@/utils/auth'
import router, { constantRoutes } from '@/router'

// 逻辑中断
// console.log(11 || 22) // 11
// console.log(0 || 22) // 22  假值 0 '' false null undefined
// console.log(11 && 22) // 22
// console.log(0 && 22) // 0

export default {
  // 一个vuex要当做模块来使用，需要加一个配置 namespaced
  namespaced: true,
  // 任何地方想要修改state里面的值，只能调用mutations里面的方法
  state: {
    // 这个值默认存储在内存上面，一刷新，一觉就忘记了，所以需要把数据保存在硬盘上面
    // 本地存储的， localStorage sessionStorage cookie
    // cookie 会伴随着http请求头，自动发送给服务器
    // 每次取值的是，先从cookie里面取，然后再给默认值
    token: getToken() || '',
    userInfo: {},
    routes: constantRoutes
  },
  mutations: {
    // 修改token值
    setTokenMutation(state, payload) {
      state.token = payload
      setToken(payload)
    },
    // 修改用户个人信息
    setUserInfoMutation(state, payload) {
      state.userInfo = payload
    },
    // 动态添加路由信息
    setRoutes(state, payload) {
      state.routes = [...constantRoutes, ...payload]
    }
  },
  actions: {
    // 只有被async修饰过的函数，函数内部才能使用await关键字
    // async loginAction(context, payload) {
    // 高级写法，我们可能不会写，但是有些同事会写，要看得懂别人代码，这个叫函数形参 解构， 去百度看看，或者vuex官网查看， 都是对 第一个参数 context的解构，里面还有很多属性，可以下去打印看看
    async loginAction({ commit }, payload) {
      // context 表示当前模块的store实例
      // 用了async+await， 就必须用try...catch包裹以下 --- 否则有些错误就不能捕获--- 浏览器控制台就会抱红色
      try {
        const res = await sysLoginRequest(payload)
        console.log('在actions里面发请求测试:', res)
        // state.token = res.data
        // context.commit('setTokenMutation', res.data)
        commit('setTokenMutation', res.data)
        // this.$router.push('/')
        router.push('/')
      } catch (err) {
        // 收集一些错误日志
        console.log('收集错误：', err)
      }

      // sysLoginRequest(payload).then(res => {
      //   console.log('在actions里面发请求测试:', res)
      //   commit('setTokenMutation', res.data)
      // }).catch(() => {
      //   //
      //   console.log(11)
      // })
    },
    // 定义一个获取用户信息的请求 actions
    async getUserInfoAction({ commit }, payload) {
      try {
        const res = await sysProfileRequest()
        // console.log(111, res)
        commit('setUserInfoMutation', res.data)
        // return res.data
        return Promise.resolve(res.data)
      } catch (err) {
        console.log('获取用户个人信息失败')
      }
      // 什么都不返回  相当于 Promise.resolve(undefined)
      // return 1 // return Promise.resolve(1)
    },
    // 情况token和userInfo的action， 里面没有异步代码，就是把多个mutation合并在一起的意思
    logoutAction({ commit }) {
      commit('setTokenMutation', '')
      commit('setUserInfoMutation', {})
    }
  }
}
